package logica.persistencia;

import java.util.LinkedList;
import java.util.List;


import logica.Entidad;
import logica.Jerarquia;
import org.jdom.Element;

import borrador.grafica.TransformadorAGraficable;

import vista.objetos.EntidadGraficable;
import vista.objetos.EntidadTipoNoSoportadoException;
import vista.objetos.GraficableConEtiqueta;
import vista.objetos.JerarquiaGraficable;
import vista.objetos.NoEsObjetoDiagramableException;
import xml.ConstantesXml;
import xml.XMLManager;

public class JerarquiaGraficablePersistente extends
		GraficableConEtiquetaPersistente {

	public JerarquiaGraficablePersistente(
			GraficableConEtiqueta _graficableConEtiqueta) {
		super(_graficableConEtiqueta);
	}

	@Override
	public void serializar() {
		Element elementoJerarquia = new Element (ConstantesXml.ELEMENTO_JERARQUIA);
		Jerarquia jerarquia = null;
		try {
			jerarquia = (Jerarquia)this.getGraficableConEtiqueta().getObjetoDiagramaDecorado();
			super.serializarGenerico(jerarquia, elementoJerarquia);
			
		} catch (NoEsObjetoDiagramableException e) {
			
			e.printStackTrace();
		}
		JerarquiaPersistente.serializarReferenciasEntidades(elementoJerarquia, jerarquia);
		
		JerarquiaPersistente.serializarReferenciaEntidadPadre(elementoJerarquia, jerarquia);
		this.getElementoPadre().addContent(elementoJerarquia);
	
		
	}


	
	@Override
	public void hidratar() {
		super.hidratarGenerico(this.getElementoGraficable());
		
		JerarquiaGraficable jerG = (JerarquiaGraficable) this.getGraficableConEtiqueta();
		
		List<EntidadGraficable> entEspG = JerarquiaGraficablePersistente.hidratarEntidadesGraficablesEspecializadas(this.getElementoGraficable());
		jerG.setEntidadesEspecializadas(entEspG);
		
		String idString = this.getElementoGraficable().getAttributeValue(ConstantesXml.ATRIBUTO_ID_REF);
		EntidadGraficable entidadGraficablePadre = (EntidadGraficable)XMLManager.getInstance().objtenerObjetoDiagramaRepConClave(idString);
				
		jerG.setEntidadPadre(entidadGraficablePadre);
		
	}

	public static List<EntidadGraficable> hidratarEntidadesGraficablesEspecializadas(
			Element elementoJerarquia) {
		
		List<EntidadGraficable> entidades = new LinkedList<EntidadGraficable>();
		Element listaElementosEntidades = elementoJerarquia.getChild(ConstantesXml.LISTA_REF_ENTIDADES);
	
		if (listaElementosEntidades != null) {
			@SuppressWarnings("unchecked")
			List<Element> elementosEntidades = listaElementosEntidades.getChildren(ConstantesXml.ELEMENTO_REF_ENTIDAD);
				
			for (Element elementoEntidad : elementosEntidades) {
				
				String idString = elementoEntidad.getAttributeValue(ConstantesXml.ATRIBUTO_ID_REF);
				
				EntidadGraficable entidadGraficable = (EntidadGraficable)XMLManager.getInstance().objtenerObjetoDiagramaRepConClave(idString);

				if (entidadGraficable != null)
					entidades.add(entidadGraficable);
			}
		}
		return entidades;
	}

	public static EntidadGraficable getEntidadGraficable(Element elementoEntidad,
			String idString) {
	
		Entidad entidad = (Entidad)XMLManager.getInstance().objtenerObjetoDiagramaConClave(idString);
		
		EntidadGraficable entidadGraficable = null;
		try {
			entidadGraficable = TransformadorAGraficable.getEntidadGraficable(entidad);
			EntidadGraficablePersistente entidadGP = new EntidadGraficablePersistente(entidadGraficable);
			entidadGP.setElementoGraficable(elementoEntidad);
			entidadGP.hidratar();
			 
		} catch (EntidadTipoNoSoportadoException e) {
			e.printStackTrace();
		}
		return entidadGraficable;
	}

}
